From 5010618157fa0cc4b7071bfd928e6161bcb59fea Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Mon, 1 Aug 2016 16:36:29 +0300 Subject: [PATCH] Warn about unused keys in dependency specification --- src/cargo/util/toml.rs | 38 ++++++++++++++++++++++- tests/bad-config.rs | 68 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 105 insertions(+), 1 deletion(-) diff --git a/src/cargo/util/toml.rs b/src/cargo/util/toml.rs index 158fbdc22..7de06ddc2 100644 --- a/src/cargo/util/toml.rs +++ b/src/cargo/util/toml.rs @@ -775,8 +775,44 @@ impl TomlDependency { cx.warnings.push(msg); } + if details.git.is_none() { + let git_only_keys = [ + (&details.branch, "branch"), + (&details.tag, "tag"), + (&details.rev, "rev") + ]; + + for &(key, key_name) in git_only_keys.iter() { + if key.is_some() { + let msg = format!("key `{}` is ignored for dependency ({}). \ + This will be considered an error in future versions", + key_name, name); + cx.warnings.push(msg) + } + } + } + let new_source_id = match (details.git.as_ref(), details.path.as_ref()) { - (Some(git), _) => { + (Some(git), maybe_path) => { + if maybe_path.is_some() { + let msg = format!("dependency ({}) specification is ambiguous. \ + Only one of `git` or `path` is allowed. \ + This will be considered an error in future versions", name); + cx.warnings.push(msg) + } + + let n_details = [&details.branch, &details.tag, &details.rev] + .iter() + .filter(|d| d.is_some()) + .count(); + + if n_details > 1 { + let msg = format!("dependency ({}) specification is ambiguous. \ + Only one of `branch`, `tag` or `rev` is allowed. \ + This will be considered an error in future versions", name); + cx.warnings.push(msg) + } + let reference = details.branch.clone().map(GitReference::Branch) .or_else(|| details.tag.clone().map(GitReference::Tag)) .or_else(|| details.rev.clone().map(GitReference::Rev)) diff --git a/tests/bad-config.rs b/tests/bad-config.rs index 997fb30a5..2ccece7d5 100644 --- a/tests/bad-config.rs +++ b/tests/bad-config.rs @@ -513,3 +513,71 @@ in the future. [FINISHED] debug [unoptimized + debuginfo] target(s) in [..] ")); } + +#[test] +fn ambiguous_git_reference() { + let foo = project("foo") + .file("Cargo.toml", r#" + [package] + name = "foo" + version = "0.0.0" + authors = [] + + [dependencies.bar] + git = "https://example.com" + branch = "master" + tag = "some-tag" + "#) + .file("src/lib.rs", ""); + + assert_that(foo.cargo_process("build").arg("-v"), + execs().with_stderr_contains("\ +[WARNING] dependency (bar) specification is ambiguous. \ +Only one of `branch`, `tag` or `rev` is allowed. \ +This will be considered an error in future versions +")); +} + +#[test] +fn both_git_and_path_specified() { + let foo = project("foo") + .file("Cargo.toml", r#" + [package] + name = "foo" + version = "0.0.0" + authors = [] + + [dependencies.bar] + git = "https://example.com" + path = "bar" + "#) + .file("src/lib.rs", ""); + + assert_that(foo.cargo_process("build").arg("-v"), + execs().with_stderr_contains("\ +[WARNING] dependency (bar) specification is ambiguous. \ +Only one of `git` or `path` is allowed. \ +This will be considered an error in future versions +")); +} + +#[test] +fn ignored_git_revision() { + let foo = project("foo") + .file("Cargo.toml", r#" + [package] + name = "foo" + version = "0.0.0" + authors = [] + + [dependencies.bar] + path = "bar" + branch = "spam" + "#) + .file("src/lib.rs", ""); + + assert_that(foo.cargo_process("build").arg("-v"), + execs().with_stderr_contains("\ +[WARNING] key `branch` is ignored for dependency (bar). \ +This will be considered an error in future versions")); +} -- 2.30.2